/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bean;

import datos.TipoObra;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import negocio.GestorTipoObraLocal;


/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
public class TipoObraBean {

    @EJB(beanName = "GestorTipoObraBean")
    private GestorTipoObraLocal gestorTipoObraBean;
    private String nombre;
    private String descripcion;
    private String nombreSubtipo;
    private String descripcionSubtipo;
    private boolean mostrarAgregar = false;
    private boolean mostrarModificar = false;
    private boolean mostrarAgregarSubtipo = false;
    private boolean mostrarModificarSubtipo = false;
    private int id;
    private int idSubtipo;

    /** Creates a new instance of TipoObraBean */
    public TipoObraBean() {
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the descripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * @return the mostrarAgregar
     */
    public boolean isMostrarAgregar() {
        return mostrarAgregar;
    }

    /**
     * @param mostrarAgregar the mostrarAgregar to set
     */
    public void setMostrarAgregar(boolean mostrarAgregar) {
        this.mostrarAgregar = mostrarAgregar;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

     /**
     * @return the mostrarModificar
     */
    public boolean isMostrarModificar() {
        return mostrarModificar;
    }

    /**
     * @param mostrarModificar the mostrarModificar to set
     */
    public void setMostrarModificar(boolean mostrarModificar) {
        this.mostrarModificar = mostrarModificar;
    }

    /**
     * @return the idSubtipo
     */
    public int getIdSubtipo() {
        return idSubtipo;
    }

    /**
     * @param idSubtipo the idSubtipo to set
     */
    public void setIdSubtipo(int idSubtipo) {
        this.idSubtipo = idSubtipo;
    }

    /**
     * @return the mostrarAgregarSubtipo
     */
    public boolean isMostrarAgregarSubtipo() {
        return mostrarAgregarSubtipo;
    }

    /**
     * @param mostrarAgregarSubtipo the mostrarAgregarSubtipo to set
     */
    public void setMostrarAgregarSubtipo(boolean mostrarAgregarSubtipo) {
        this.mostrarAgregarSubtipo = mostrarAgregarSubtipo;
    }

    /**
     * @return the mostrarModificarSubtipo
     */
    public boolean isMostrarModificarSubtipo() {
        return mostrarModificarSubtipo;
    }

    /**
     * @param mostrarModificarSubtipo the mostrarModificarSubtipo to set
     */
    public void setMostrarModificarSubtipo(boolean mostrarModificarSubtipo) {
        this.mostrarModificarSubtipo = mostrarModificarSubtipo;
    }

    /**
     * @return the nombreSubtipo
     */
    public String getNombreSubtipo() {
        return nombreSubtipo;
    }

    /**
     * @param nombreSubtipo the nombreSubtipo to set
     */
    public void setNombreSubtipo(String nombreSubtipo) {
        this.nombreSubtipo = nombreSubtipo;
    }

    /**
     * @return the descripcionSubtipo
     */
    public String getDescripcionSubtipo() {
        return descripcionSubtipo;
    }

    /**
     * @param descripcionSubtipo the descripcionSubtipo to set
     */
    public void setDescripcionSubtipo(String descripcionSubtipo) {
        this.descripcionSubtipo = descripcionSubtipo;
    }

    /**
     *
     * @return
     */
    public List getTipoDeObras() {
        return this.gestorTipoObraBean.consultarTipoObra();
    }

    /**
     *
     * @param e
     */
    public void guardarTipoObraOyente(ActionEvent e){
        this.setDescripcion("");
        this.setNombre("");
        this.setMostrarAgregar(true);
        this.setMostrarModificar(false);
        this.setMostrarAgregarSubtipo(false);
        this.setMostrarModificarSubtipo(false);
    }

    /**
     *
     * @return
     */
    public String guardarTipoObra() {
        TipoObra to = new TipoObra();
        to.setNombre(nombre.toUpperCase());
        to.setDescripcion(descripcion.toUpperCase());
        boolean existe = this.gestorTipoObraBean.existeNombreTipoObra(to);
        if (!existe) {
            this.gestorTipoObraBean.agregarTipoObra(to);
            this.mostrarAgregar = false;
            this.mostrarModificar = false;
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Tipo de Obra guardado con exito", ""));
        } else {
            this.setNombre("");
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe un Tipo de Obra con ese nombre", ""));
        }
        return null;
        //Como idea podriamos hacer que navegue a una pagina de error si al agregar hubo un error
    }

    /**
     *
     * @param e
     */
    public void modificarTipoObraOyente(ActionEvent e){
        this.setDescripcion("");
        this.setNombre("");
        this.setMostrarAgregar(false);
        this.setMostrarModificar(true);
        this.setMostrarAgregarSubtipo(false);
        this.setMostrarModificarSubtipo(false);
        UIParameter component = (UIParameter) e.getComponent().findComponent("idModificar");
        this.setId((Integer) Integer.parseInt(component.getValue().toString()));
        component = (UIParameter) e.getComponent().findComponent("nombre");
        this.setNombre(component.getValue().toString());
        component = (UIParameter) e.getComponent().findComponent("descripcion");
        this.setDescripcion(component.getValue().toString());
    }

    /**
     *
     * @return
     */
    public String modificarTipoObra() {
        TipoObra to = new TipoObra();
        to.setId(this.getId());
        to.setNombre(this.getNombre().toUpperCase());
        to.setDescripcion(this.getDescripcion().toUpperCase());
        boolean existe = this.gestorTipoObraBean.existeNombreTipoObraModificar(to);
        if (!existe) {
            this.gestorTipoObraBean.modificarTipoObra(to);
            this.mostrarAgregar = false;
            this.mostrarModificar = false;
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Tipo de Obra modificado con exito", ""));
        } else {
            this.setNombre("");
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe un Tipo de Obra con ese nombre", ""));
        }
        return null;
    }

    /**
     *
     * @param e
     */
    public void eliminarTipoObraOyente(ActionEvent e){
        UIParameter component = (UIParameter) e.getComponent().findComponent("idBorrar");
        this.setId((Integer) Integer.parseInt(component.getValue().toString()));
    }

    /**
     *
     * @return
     */
    public String eliminarTipoObra() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (!this.gestorTipoObraBean.tipoObraFueAsignadoObras(id)) {
            TipoObra to = new TipoObra();
            to.setId(id);
            this.gestorTipoObraBean.eliminarTipoObra(to);
            context.addMessage(null, new FacesMessage("Tipo de Obra eliminado con exito", ""));
        } else {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "No puede eliminar ese Tipo de Obra porque fue asignado, por lo menos, a una Obra Pública", ""));
        }
        return null;
    }

    /**
     *
     * @param e
     */
    public void cancelarOyente(ActionEvent e) {
        this.setNombre("");
        this.setDescripcion("");
        this.setNombreSubtipo("");
        this.setDescripcionSubtipo("");
        this.setMostrarAgregar(false);
        this.setMostrarModificar(false);
        this.setMostrarAgregarSubtipo(false);
        this.setMostrarModificarSubtipo(false);
    }

    /**
     *
     * @return
     */
    public List getSubTiposObra(){
        return this.gestorTipoObraBean.subTiposObra(this.id);
    }

    /**
     *
     * @return
     */
    public String guardarSubtipoObra() {
        boolean existe = this.gestorTipoObraBean.existeNombreSubtipoObra(this.id, this.nombreSubtipo.toUpperCase());
        if (!existe) {
            this.gestorTipoObraBean.agregarSubtipoObra(this.nombreSubtipo.toUpperCase(), this.descripcionSubtipo.toUpperCase(), this.id);
            this.mostrarAgregarSubtipo = false;
            this.mostrarModificarSubtipo = false;
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Subtipo de Obra guardado con exito", ""));
        } else {
            this.mostrarAgregarSubtipo = false;
            this.mostrarModificarSubtipo = false;
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe un Subtipo para ese Tipo de obra con ese nombre", ""));
        }
        return null;
    }

    /**
     *
     * @return
     */
    public String modificarSubtipoObra() {
        boolean existe = this.gestorTipoObraBean.existeNombreSubtipoObraModificar(this.id, this.nombreSubtipo.toUpperCase(), this.idSubtipo);
        if (!existe) {
            this.gestorTipoObraBean.modificarSubtipoObra(this.idSubtipo, this.nombreSubtipo.toUpperCase(), this.descripcionSubtipo.toUpperCase());
            this.mostrarAgregarSubtipo = false;
            this.mostrarModificarSubtipo = false;
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Subtipo de Obra modificado con exito", ""));
        } else {
            this.mostrarAgregarSubtipo = false;
            this.mostrarModificarSubtipo = false;
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe un Subtipo para ese Tipo de obra con ese nombre", ""));
        }
        return null;
    }

    /**
     *
     * @return
     */
    public String eliminarSubtipoObra() {
        FacesContext context = FacesContext.getCurrentInstance();
        //if (!this.gestorTipoObraBean.tipoObraFueAsignadoObras(id)) {

            this.gestorTipoObraBean.eliminarSubtipoObra(this.idSubtipo);
            context.addMessage(null, new FacesMessage("Subtipo de Obra eliminado con exito", ""));
            /**
             * Falta validar que este subtipo no este asignado a ninguna obra,
             * pero para eso hay que cambiar las relaciones de obra:
             * en vez de estar relacionada con tipo solamente, debe estar
             * relacionada con subtipo también.
             */



//        } else {
//            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "No puede eliminar ese Tipo de Obra porque fue asignado, por lo menos, a una Obra Pública", ""));
//        }
        return null;
    }

    
   

    

    
}
